//페이지 구성완료후 이벤트
$("#diary").die();
$("#diary").live("pageinit", function() {

	// 페이지 정보
	var page = {
		"dom" : $(this),
		"id" : this.id
	}

	var foodKcal = 0;
	var trainingKcal = 0;
	var totalKcal = 0;

	var pageDate = UTIL.today();

	// 모델
	var model = (function() {
		var my = {};
		my.getDiaryFoodData = function(thisDate, callback) {
			var sql = "select insert_date , title, SUM(kcal) as kcal, timestamp, count(*) as cnt, kind from diary_base where insert_date = '" + thisDate + "' and type = 'food' group by kind";
			Storage.execDataBase(sql, callback);
		}

		my.deleteDiaryFoodData = function(thisDate, timestamp, callback) {
			var sql = "delete from diary_base where insert_date = '" + thisDate + "' and type = 'food' and timestamp = '" + timestamp + "'";
			Storage.execDataBase(sql, callback);
		}

		my.deleteDiaryFoodMultiData = function(thisDate, kind, count, callback) {
			var sql = "delete from diary_base where timestamp in(select timestamp from diary_base where insert_date = '" + thisDate + "' and kind = '" + kind + "' and type = 'food'  limit '" + count + "')";
			Storage.execDataBase(sql, callback);
		}

		// 음식 추가 하기
		my.setAddFoodToDiary = function(thisDate, data, cb) {
			var callback = cb || $.noop();
			var sql = "insert into diary_base ( 'insert_date', 'title', 'kcal','timestamp', 'type', 'kind') values('" + thisDate + "','" + data.title + "','" + data.kcal + "','" + $.now() + "','food','" + data.timestamp + "')";
			Storage.execDataBase(sql, callback)
		}

		// 로컬 스토리지에서 Training List 가져오기
		my.getMyTrainingList = function(param) {
			return Storage.getLocalData("myTrainingList");
		}

		my.getDiaryTrainingData = function(thisDate, callback) {
			var sql = "select insert_date , title, SUM(kcal) as kcal, timestamp, count(*) as cnt, kind from diary_base where insert_date = '" + thisDate + "' and type = 'training' group by kind";
			Storage.execDataBase(sql, callback);
		}

		my.deleteDiaryTrainingData = function(thisDate, timestamp, callback) {
			var sql = "delete from diary_base where insert_date = '" + thisDate + "' and type = 'training' and timestamp = '" + timestamp + "'";
			Storage.execDataBase(sql, callback);
		}

		// 운동 멀티 삭제
		my.deleteDiaryTrainingMultiData = function(thisDate, kind, count, callback) {
			var sql = "delete from diary_base where timestamp in(select timestamp from diary_base where insert_date = '" + thisDate + "' and kind = '" + kind + "' and type = 'training'  limit '" + count + "')";
			Storage.execDataBase(sql, callback);
		}

		// 운동 추가 하기
		my.setAddTrainingToDiary = function(thisDate, data, cb) {
			var callback = cb || $.noop();
			var sql = "insert into diary_base ( 'insert_date', 'title', 'kcal','timestamp', 'type', 'kind') values('" + thisDate + "','" + data.title + "','" + data.kcal + "','" + $.now() + "','training','" + data.timestamp + "')";
			Storage.execDataBase(sql, callback)
		}

		my.getDiaryPicture = function(thisDate, callback) {
			var sql = "select * from diary_picture where insert_date = '" + thisDate + "'";
			Storage.execDataBase(sql, callback);
		}

		my.setDiaryPicture = function(thisDate, location, callback) {
			var sql = "INSERT INTO diary_picture ('insert_date', 'location') VALUES ('" + thisDate + "', '" + location + "')";
			Storage.execDataBase(sql, callback);
		}

		my.updateDiaryPicture = function(thisDate, location, callback) {
			var sql = "update diary_picture set location='" + location + "' where insert_date='" + thisDate + "'";
			Storage.execDataBase(sql, callback);
		}

		//몸무게 데이터 가져오기
		my.getWeightData = function(thisDate, day, callback) {
//			var sql = "select * from diary_weight where insert_date > (select strftime('%Y%m%d','now','localtime','-" + day + " day')) order by insert_date";
			var sql = "select * from diary_weight where insert_date > '" + UTIL.subDay(thisDate ,day, "dateType") + "' order by insert_date";
			Storage.execDataBase(sql, callback);
		}

		//몸무게 데이터 가져오기
		my.getWeightDataInToday = function(thisDate, weight, callback) {
//			var sql = "select * from diary_weight where insert_date == (select strftime('%Y%m%d','now','localtime'))";
			var sql = "select * from diary_weight where insert_date = '" + thisDate + "'";
			Storage.execDataBase(sql, function(result) {
				if (result.length === 0) {
					sql = "insert into diary_weight VALUES('" + thisDate + "','" + weight + "')";
					console.log(sql);
					Storage.execDataBase(sql, callback);
				} else {
					sql = "update diary_weight set weight = '" + weight + "' where insert_date='" + thisDate + "'";
					Storage.execDataBase(sql, callback);
				}
			});
		}

		// 로컬 스토리지에서 Food List 가져오기
		my.getMyFoodList = function(param) {
			return Storage.getLocalData("myFoodList");
		}

		return my;
	})();

	// 뷰
	var view = (function() {
		var my = {};

		// 홈버튼 가져오기
		my.getHomeMoveButton = function() {
			return $("#home_move_button", page.dom);
		}

		// 음식 이동 버튼 가져오기
		my.getFoodMoveButton = function() {
			return $("#food_move_button", page.dom);
		}

		// 운동 이동 버튼 가져오기
		my.getTrainingMoveButton = function() {
			return $("#training_move_button", page.dom);
		}

		// 다이어리 이동 버튼 가져오기
		my.getDiaryMoveButton = function() {
			return $("#diary_move_button", page.dom);
		}

		// 코치 이동 버튼 가져오기
		my.getCoachMoveButton = function() {
			return $("#coach_move_button", page.dom);
		}

		// 다이어리 음식 리스트
		my.getDiaryFoodList = function() {
			return $(".diary_food_list", page.dom);
		}

		// 다이어리 음식 리스트 콘텐츠
		my.getDiaryFoodListContent = function() {
			return $(".diary_food_list_content", page.dom);
		}

		// 다이어리 음식 리스트 템플릿
		my.getDiaryFoodListTemplate = function() {
			return $(".diary_food_list_template", page.dom);
		}

		// 다이어리 운동 리스트
		my.getDiaryTrainingList = function() {
			return $(".diary_training_list", page.dom);
		}

		// 다이어리 운동 리스트 콘텐츠
		my.getDiaryTrainingListContent = function() {
			return $(".diary_training_list_content", page.dom);
		}

		// 다이어리 운동 리스트 템플릿
		my.getDiaryTrainingListTemplate = function() {
			return $(".diary_training_list_template", page.dom);
		}

		// 다이어리 네브바 가져오기
		my.getDiaryNavbar = function() {
			return $("#diary_navbar", page.dom);
		}

		// 콘텐츠 영역 가져오기
		my.getPageContent = function() {
			return $("[data-role='content']", page.dom);
		}

		// 오늘의 총칼로리
		my.getTodayKcalLabel = function() {
			return $(".today_kcal_label", page.dom);
		}

		// 오늘의 총칼로리
		my.getTodayKcalLabel = function() {
			return $(".today_kcal_label", page.dom);
		}

		// 음식 없음 리스트
		my.getDiaryFoodNolist = function() {
			return $(".diary_food_nolist", page.dom);
		}

		// 운동 없음 리스트
		my.getDiaryTrainingNolist = function() {
			return $(".diary_training_nolist", page.dom);
		}

		// 사진 추가
		my.getCameraPickerButton = function() {
			return $("#camera_picker_button", page.dom);
		}

		// 상단 탭바 +- 버튼
		my.getAddDiaryButton = function() {
			return $("#add_diary_button", page.dom);
		}

		// 상단 음식추가
		my.getAddFoodButton = function() {
			return $("#add_food_button", page.dom);
		}

		// 상단 음식추가
		my.getAddTrainingButton = function() {
			return $("#add_exec_button", page.dom);
		}

		// 그래프 공간
		my.getGraphArea = function() {
			return $("#graph_area", page.dom);
		}

		// 그래프 탭 페이지
		my.getGraphTabPage = function() {
			return $(".graph_tab_page", page.dom);
		}

		// 그래프 버튼
		my.getGraphMoveButton = function() {
			return $("#graph_move_button", page.dom);
		}

		// 다이어리 페이지
		my.getDiaryContentPage = function() {
			return $(".diary_content_page", page.dom);
		}

		// 단위 변경 셀렉트
		my.getStepChangeSelect = function() {
			return $("select.step_change_select", page.dom);
		}

		// 몸무게 추가 버튼
		my.getAddWeightButton = function() {
			return $(".add_weight_button", page.dom);
		}
		
		// 날짜 라벨
		my.getTodayLabel = function() {
			return $(".today_label", page.dom);
		}
		
		// 리스트 이동 버튼
		my.getMoveListButton = function() {
			return $("#move_list_button", page.dom);
		}
		
		// 권장칼로리 라벨
		my.getTargetKcalLabel = function() {
			return $(".target_kcal_label", page.dom);
		}

		return my;
	})();

	// 컨트롤러
	var controll = (function() {

		var toggleCheck = true;

		// 음식 리스트 세팅
		view.getDiaryFoodListContent().onList("makeList", {
			'content' : view.getDiaryFoodListContent(),
			'template' : view.getDiaryFoodListTemplate(),
			'target' : function($item) {
				return {
					"TITLE" : $(".title", $item),
					"COUNT" : $(".count", $item),
					"SUB_TITLE" : $(".sub_title", $item)
				};
			},
			'data' : function($item, data) {
				$item.TITLE.text(data.title);
				$item.TITLE.attr("timestamp", data.timestamp);
				$item.TITLE.attr("count", data.cnt);
				$item.TITLE.attr("kind", data.kind);
				$item.COUNT.text("X " + data.cnt);
				$item.SUB_TITLE.text(data.kcal + " Kcal");
			},
			'onAddsFinish' : function() {
			}
		});

		// 운동 리스트 세팅
		view.getDiaryTrainingListContent().onList("makeList", {
			'content' : view.getDiaryTrainingListContent(),
			'template' : view.getDiaryTrainingListTemplate(),
			'target' : function($item) {
				return {
					"TITLE" : $(".title", $item),
					"COUNT" : $(".count", $item),
					"SUB_TITLE" : $(".sub_title", $item)
				};
			},
			'data' : function($item, data) {
				$item.TITLE.text(data.title);
				$item.TITLE.attr("timestamp", data.timestamp);
				$item.TITLE.attr("count", data.cnt);
				$item.TITLE.attr("kind", data.kind);
				$item.COUNT.text("X " + data.cnt);
				$item.SUB_TITLE.text(data.kcal + " Kcal");
			},
			'onAddsFinish' : function() {
			}
		});

		var updateKcal = function(type) {
			view.getTodayKcalLabel().text((foodKcal + trainingKcal) + " Kcal");
		}

		// 그래프 페이지 토글
		var toggleGraphPage = function(state) {
			if (state) {
				view.getDiaryContentPage().hide();
				view.getGraphTabPage().show();
			} else {
				view.getDiaryContentPage().show();
				view.getGraphTabPage().hide();
			}
		}

		// 그래프 그리기
		var drawGraph = function(data, count) {
			var step = count || 6;
			var container = view.getGraphArea()[0];
			var start, d1 = [], i, x;
			var date_list = [];
			start = UTIL.subDay(pageDate, step);

			for (i = 0; i <= step; i++) {
				date_list.unshift(UTIL.subDay(pageDate, i, "dateType"));
			}

			for (i = 0; i <= step; i++) {
				x = start + (i * CONSTANT.DAYTOTIME());
				// d1.push([ x, i + Math.random() * 30 + Math.sin(i / 20 +
				// Math.random() * 2) * 20 + Math.sin(i / 10 + Math.random()) *
				// 10 ]);

				var nullcheck = true;
				for ( var key in data) {
					try {
						if (data[key].insert_date === date_list[i]) {
							d1.push([ x, data[key].weight ]);
							nullcheck = false;
							break;
						}
					} catch (e) {
					}
				}

				if (nullcheck) {
					if (d1.length === 0) {
						d1.push([ x, 0 ]);
					} else {
						d1.push([ x, d1[d1.length - 1][1] ]);
					}
				}
			}
			var yMax;
			try {
				yMax = data[0].weight * 1.5;
			} catch (e) {
				yMax = 40;
			}
			var xMin, xMax;
			xMin = UTIL.subDay(d1[0][0], 1);
			xMax = UTIL.addDay(d1[d1.length - 1][0], 1);
			// Draw the graph.
			graph = Flotr.draw(container, [ {
				data : d1,
				label : '단위(kg)',
				lines : {
					show : true
				},
				points : {
					show : true
				},
				markers : {
					show : true,
					position : 'ct'
				}
			} ], {
				xaxis : {
					mode : 'time',
					labelsAngle : 45,
					min : xMin,
					max : xMax,
				},
				yaxis : {
					max : yMax,
					min : 0,
					autoscaleMargin : 1,
					margin : true
				}
			});
		}

		//몸무게 그래프 지정
		var setWeightGraph = function(day) {
			model.getWeightData(pageDate, day, function(result) {
				drawGraph(result, day);
			})
		}

		var my = {};
		my.execToggleGraphPage = function(state) {
			toggleGraphPage(state);
		};
		
		my.setPageDate = function () {
			var date = new Date(UTIL.dateFormat(pageDate));
			view.getTodayLabel().text(UTIL.getDateHanFormat(date));
			
			view.getTargetKcalLabel().text(CONSTANT.GET_TARGET_KCAL() + " Kcal");
			
			controll.fillDiaryFoodList();
			controll.fillDiaryTrainingList();
			controll.execToggleGraphPage(false);
		};

		// 리스트 채우기
		my.fillDiaryFoodList = function() {
			view.getDiaryFoodListContent().html("");
			model.getDiaryFoodData(pageDate, function(foodList) {
				foodKcal = 0;
				if (foodList.length > 0) {
					view.getDiaryFoodNolist().hide();
					$.each(foodList, function(i, value) {
						foodKcal += UTIL.NUMBER(value["kcal"]);
					});
					view.getDiaryFoodListContent().onList("setList", foodList);
				} else {
					view.getDiaryFoodNolist().show();
				}
				updateKcal();
			})
		}
		// 리스트 채우기
		my.fillDiaryTrainingList = function() {
			view.getDiaryTrainingListContent().html("");
			model.getDiaryTrainingData(pageDate, function(trainingList) {
				trainingKcal = 0;
				if (trainingList.length > 0) {
					view.getDiaryTrainingNolist().hide();
					$.each(trainingList, function(i, value) {
						trainingKcal += UTIL.NUMBER(value["kcal"]);
					});
					view.getDiaryTrainingListContent().onList("setList", trainingList);
				} else {
					view.getDiaryTrainingNolist().show();
				}
				updateKcal();
			})
		}

		// controll 초기화
		my.init = function() {
			// 음식으로 이동
			view.getFoodMoveButton().bind("atap", function() {
				$.mobile.moveTab(pageUrl.food);
			});

			// 운동으로 이동
			view.getTrainingMoveButton().bind("atap", function() {
				$.mobile.moveTab(pageUrl.training);
			});

			// 코치로 이동
			view.getCoachMoveButton().bind("atap", function() {
				$.mobile.moveTab(pageUrl.coach);
			});

			// 탭보였다 없앴다 하기.
			view.getAddDiaryButton().on("atap", function() {
				view.getDiaryNavbar().toggle().trigger("updatelayout");
			});

			view.getGraphMoveButton().on("atap", function(e) {
				toggleGraphPage(true);
				setWeightGraph(view.getStepChangeSelect().val());
			});

			view.getStepChangeSelect().on("change", function(e) {
				setWeightGraph($(this).val());
			});

			// 음식 추가
			view.getAddFoodButton().on("atap", function(e) {
				toggleGraphPage(false);
				var FoodList = model.getMyFoodList();
				var FoodIdx = PLUGIN.popupAddList(JSON.stringify(FoodList));
				if (FoodIdx) {
					FoodIdx = JSON.parse(FoodIdx);

					model.setAddFoodToDiary(pageDate, FoodList[FoodIdx.position], function() {
						my.fillDiaryFoodList();
					});
				}
			});

			// 운동 추가
			view.getAddTrainingButton().on("atap", function(e) {
				toggleGraphPage(false);
				var TrainingList = model.getMyTrainingList();
				var TrainingIdx = PLUGIN.popupAddList(JSON.stringify(TrainingList));
				if (TrainingIdx) {
					TrainingIdx = JSON.parse(TrainingIdx);

					model.setAddTrainingToDiary(pageDate, TrainingList[TrainingIdx.position], function() {
						my.fillDiaryTrainingList();
					});
				}
			});

			//몸무게 추가 버튼
			view.getAddWeightButton().on("atap", function() {
				var weight = prompt("당신의 몸무게는 몇 kg 입니까?");
				Storage.setLocalData("recentWeight", weight);
				model.getWeightDataInToday(pageDate, weight, function() {
					setWeightGraph(view.getStepChangeSelect().find("option:selected").val());
				});
			});

			view.getCameraPickerButton().on("atap", function(e) {
				toggleGraphPage(false);
				model.getDiaryPicture(pageDate, function(result) {
					if (result.length === 0) {
						var result = PLUGIN.popupAddPicture();
						if (result) {
							result = JSON.parse(result);
							model.setDiaryPicture(pageDate, result.location);
						}
					} else {
						var result = PLUGIN.popupModifyPicture(result[0].location);
						if (result) {
							result = JSON.parse(result);
							model.updateDiaryPicture(pageDate, result.location);
						}
					}
				});
			});
			
			view.getMoveListButton().on("atap", function (e) {
				$.mobile.movePage(pageUrl.list);
			});

			page.dom.on("swipe tap", ".diary_food_list", function(e) {
				var $title = $(this).find(".title");
				if (UTIL.NUMBER($title.attr("count")) > 1) {
					var count = prompt($title.text() + "(을)를 몇개 삭제 하시겠습니까?");
					if (count) {
						var kind = $title.attr("kind");
						model.deleteDiaryFoodMultiData(pageDate, kind, count, function() {
							my.fillDiaryFoodList();
						});
					}
				} else {
					if (confirm($title.text() + "(을)를 삭제 하시겠습니까?")) {
						var timestamp = $title.attr("timestamp");
						model.deleteDiaryFoodData(pageDate, timestamp, function() {
							my.fillDiaryFoodList();
						});
					}
				}
			});

			page.dom.on("swipe tap", ".diary_training_list", function(e) {
				var $title = $(this).find(".title");
				if (UTIL.NUMBER($title.attr("count")) > 0) {
					var count = prompt($title.text() + "(을)를 몇개 삭제 하시겠습니까?");
					if (count) {
						var kind = $title.attr("kind");
						model.deleteDiaryTrainingMultiData(pageDate, kind, count, function() {
							my.fillDiaryTrainingList();
						});
					}
				} else {
					if (confirm($title.text() + "(을)를 삭제 하시겠습니까?")) {
						var timestamp = $title.attr("timestamp");
						model.deleteDiaryTrainingData(pageDate, timestamp, function() {
							my.fillDiaryTrainingList();
						});
					}
				}
			});
		}

		return my;
	})();

	// controll 초기화 실행
	controll.init();


	// 페이지 시작시
	page.dom.on("startPage", function(e, data, prevPageId) {
		pageDate = UTIL.today();
		controll.setPageDate();
	});
	// 페이지 재시작시(뒤로 오는 경우)
	page.dom.on("reStartPage", function(e, data, prevPageId) {
		if ((data) ? data.thisDate : false) {
			pageDate = data.thisDate;
		} else {
			pageDate = UTIL.today();
		}
		controll.setPageDate();
	});
	
});